#ifndef OBJECTID_H_
#define OBJECTID_H_

/* Format id:
 * char Type - okresla typ obiektu
 * char Owner - okresla wlasciciela obiektu 0 - 254 wolne / 255 - bez wlasciciela
 * short Id - wewnetrzne id obiektu
 */

//Typy obiektow:
#define OT_UNDEFINED		0
#define OT_PLAYER_NINJA		1
#define OT_PLAYER_PIRATE	2

#define OT_BULLET_SMALLARMS	3

//Typy wlasnosci
#define OO_NOONE			255 //Odpowiada Core::PlayerArray::INVALID_ID

namespace GameLogic {
namespace Objects {

/* Klasa stanowi identyfikator obiektu. Stanowi wrapper dla wlasciwego typu przechowujacego
 * id (w tej chwili int) i udsotepniac metody do sterowania 'czesciami' id - np. metody getType(),
 * getOwner()... etc. Pamietajac, ze int = char[4] powinno sie dac zrobic ladny podzial. */
class ObjectId {
public:
	/* Wewnetrzna reprzentacja id. */
	typedef int InternalNumericType;
	/* Typ obiektu. */
	typedef unsigned char Type;
	/* Numer wlasciciela obiektu. */
	typedef unsigned char Owner;
	/* Wewnetrzne id obiektu. */
	typedef unsigned short Id;

	static const ObjectId INVALID_ID;
private:
	InternalNumericType id_;

	/* Ustawia typ obiektu. */
	void setType( Type type ) {
		*( reinterpret_cast<Type*>(&id_) ) = type;
	};
	/* Ustawia wlasciciela obiektu. */
	void setOwner( Owner owner ) {
		*( reinterpret_cast<Owner*>(&id_) + 1 ) = owner;
	};
	/* Ustawia id obiektu. */
	void setId( Id id ) {
		*( reinterpret_cast<Id*>(&id_) + 1 ) = id;
	};

public:

	ObjectId(): id_( 0 ) {};
	ObjectId( InternalNumericType id ): id_(id) {};
	ObjectId( Type type, Owner owner, Id id ) {
		setType( type );
		setOwner( owner );
		setId( id );
	};
	bool operator ==( const ObjectId& o ) { return id_ == o.id_; };
	bool operator !=( const ObjectId& o ) { return id_ != o.id_; };
	ObjectId& operator=( const ObjectId& o ) { id_ = o.id_; return *this; };
	bool operator<( const ObjectId& o ) const { return id_ < o.id_; };
	bool operator>( const ObjectId& o ) const { return id_ > o.id_; };
	ObjectId operator=( const ObjectId& o ) const { return ObjectId( id_ + o.id_ ); };
	/* Zwraca typ obiektu. */
	Type getType() {
		return *( reinterpret_cast<Type*>(&id_) );
	};
	/* Zwraca wlasciciela obiektu. */
	Owner getOwner() {
		return *( reinterpret_cast<Owner*>(&id_) + 1 );
	};
	/* Zwraca id obiektu. */
	Id getId() {
		return *( reinterpret_cast<Id*>(&id_) + 1 );
	};

	InternalNumericType toNumeric() const { return id_; };

};

} //namespace Objects
} //namespace GameLogic

#endif /* OBJECTID_H_ */
